Графические интерфейсы пользователя Java - Тимур Сергеевич Машнин
lly (новая координата по оси Y левого нижнего угла изображения),
lrx (новая координата по оси Х правого нижнего угла изображения),
lry (новая координата по оси Y правого нижнего угла изображения),
ulx (новая координата по оси Х левого верхнего угла изображения),
uly (новая координата по оси Y левого верхнего угла изображения),
urx (новая координата по оси Х правого верхнего угла изображения),
ury (новая координата по оси Y правого верхнего угла изображения).
Свойство input класса PerspectiveTransform может определять в качестве входа другой эффект Effect, создавая, таким образом, цепочку эффектов.
Приведенный здесь код демонстрирует панель ScrollPane, содержащую изображения с PerspectiveTransform-эффектом.
Здесь мы создаем набор изображений и эффект перспективы.
Для эффекта мы устанавливаем измененные координаты сторон изображения и присоединяем эффект к каждому изображению.
Reflection-эффект обеспечивает эффект отражения исходного изображения узла Node.
Свойства topOpacity (от 0.0 до 1.0, по умолчанию 0.5) и bottomOpacity (от 0.0 до 1.0, по умолчанию 0.0) класса Reflection определяют прозрачность верхнего и нижнего края отражения.
Свойство topOffset определяет интервал между краями изображения и его отражения,
а свойство fraction – долю изображения, видимую в отражении (от 0.0 до 1.0, по умолчанию 0.75).
Свойство input класса Reflection может определять в качестве входа другой эффект Effect, создавая, таким образом, цепочку эффектов.
Приведенный здесь код демонстрирует узел Text с цепочкой эффектов, состоящей из Reflection-эффекта и InnerShadow-эффекта и создающей иллюзию отражения объемного текста в плоскости, представленной узлом Rectangle с PerspectiveTransform-эффектом.
Здесь мы создаем прямоугольник и заполняем его градиентом.
Затем мы создаем эффект перспективы и применяем его к прямоугольнику.
Далее мы создаем текст и два эффекта – внутреннюю тень и отражение, из эффектов создаем цепочку эффектов и применяем эту цепочку к тексту.
SepiaTone-эффект обеспечивает эффект старения исходного изображения узла Node.
Уровень старения исходного изображения определяется свойством level (от 0.0 до 1.0, по умолчанию 1.0) класса SepiaTone.
Свойство input класса SepiaTone может определять в качестве входа другой эффект Effect, создавая, таким образом, цепочку эффектов.
Приведенный здесь код демонстрирует панель ScrollPane, содержащую изображения с цепочкой эффектов, состоящей из PerspectiveTransform-эффекта и SepiaTone-эффекта.
Трансформации и анимации
Начнем с анимаций.
Платформа JavaFX обеспечивает создание двух видов анимации – анимацию по ключевым кадрам и анимацию со встроенной временной шкалой.
JavaFX-анимацию представляет пакет javafx.animation, базовым классом которого является класс Animation.
Класс Animation расширяется классами Timeline и Transition, при этом класс Timeline представляет анимацию по ключевым кадрам, а класс Transition – анимацию со встроенной временной шкалой.
Класс Animation имеет набор свойств, позволяющих управлять скоростью и направлением анимации, задержкой и количеством циклов анимации, устанавливать автореверс анимации, считывать статус анимации, обрабатывать завершение анимации и др.
Скорость и направление анимации можно установить с помощью метода setRate,
задержку анимации – с помощью метода setDelay,
количество циклов анимации – методом setCycleCount,
автореверс анимации – методом setAutoReverse,
считать статус PAUSED, RUNNING или STOPPED анимации – методом getStatus,
установить обработчик завершения анимации – методом setOnFinished.
Также класс Animation предоставляет методы управления жизненным циклом анимации:
jumpTo – переход анимации к указанной позиции на временной шкале.
playFrom – запуск анимации, начиная с указанной позиции на временной шкале.
play – запуск анимации с текущей позиции на временной шкале.
playFromStart – запуск анимации с первоначальной позиции на временной шкале.
stop – остановка анимации.
pause – пауза анимации.
Анимация по ключевым кадрам позволяет создать видимое изменение значения любого JavaFX-свойства за определенный промежуток времени с помощью класса Timeline.
Экземпляр класса Timeline можно создать с помощью набора конструкторов, позволяющих установить частоту кадров и набор ключевых кадров анимации.
Набор ключевых кадров Timeline-анимации можно заполнить методом getKeyFrames.addAll, а остановить Timeline-анимацию и вернуть ее в первоначальную позицию – методом stop.
Ключевой кадр Timeline-анимации представлен классом KeyFrame и определяет изменения значений JavaFX-свойств за определенный промежуток времени.
Экземпляр класса KeyFrame можно создать с помощью набора конструкторов, позволяющих установить время воспроизведения ключевого кадра, имя ключевого кадра, обработчик окончания ключевого кадра и набор изменений значений JavaFX-свойств.
Изменение значения JavaFX-свойства представлено классом KeyValue, экземпляр которого можно создать с помощью конструкторов, позволяющих установить изменяемое JavaFX-свойство, его конечное значение в результате анимации и способ его изменения в течение анимации.
Способ изменения значения JavaFX-свойства в течение анимации представлен классом Interpolator, имеющим статические поля:
DISCRETE – дискретное изменение значения JavaFX-свойства, при которой значение остается начальным до окончания временного интервала, когда значение становится конечным.
LINEAR (по умолчанию) – линейное изменение значения JavaFX-свойства, при которой значение определяется по формуле startValue + (endValue – startValue) * fraction.
EASE_BOTH – используется величина 0.2 для прироста и уменьшения значения JavaFX-свойства.
EASE_IN – используется величина 0.2 для прироста значения JavaFX-свойства.
EASE_OUT – используется величина 0.2 для уменьшения значения JavaFX-свойства.
Кроме того, можно создать пользовательский класс Interpolator с переопределением его методов, описывающих изменение значения JavaFX-свойства.
Transition-анимация со встроенной временной шкалой также использует объект Interpolator в качестве значения свойства interpolator класса Transition.
Таким образом, анимацию изменения значений нескольких JavaFX-свойств можно создать двумя способами.
Первый способ – это создание одного ключевого кадра KeyFrame и добавление в него несколько объектов KeyValue.
Другой способ – это создание отдельных ключевых кадров KeyFrame для каждого из объектов KeyValue и добавление их в Timeline-анимацию.
Transition-анимация со встроенной временной шкалой, в отличие от Timeline-анимации, описывает изменение во времени ограниченного набора JavaFX-свойств, таких как прозрачность, пространственное положение, вращение и масштабирование узла графа сцены, а также цвет заполнения и цвет контура формы Shape.
Анимация прозрачности узла графа сцены создается с помощью класса FadeTransition, имеющим свойства byValue (шаг изменения свойства прозрачности), duration (продолжительность анимации), fromValue (начальное значение прозрачности), node (целевой узел графа сцены данной анимации) и toValue (конечное значение прозрачности).
Анимация пространственного положения узла графа сцены создается с помощью классов PathTransition и TranslateTransition.
Класс PathTransition позволяет создавать перемещение графического объекта вдоль кривой с помощью свойств duration (продолжительность анимации), orientation (NONE – ориентация графического объекта не изменяется или ORTHOGONAL_TO_TANGENT – графический объект перпендикулярен относительно кривой своего перемещения) и path (объект Shape, представляющий кривую перемещения).
Класс TranslateTransition позволяет создавать перемещение графического объекта из одной 3D точки в другую 3D точку с помощью свойств node (целевой узел для анимации), duration (продолжительность анимации), fromX (начальная координата перемещения по оси х), fromY (начальная координата перемещения по оси у), fromZ (начальная координата перемещения по оси z), toX (конечная координата перемещения по оси х), toY (конечная координата перемещения по оси у), toZ (конечная координата перемещения по оси z), byX (шаг перемещения по оси х), byY (шаг перемещения по оси у) и byZ (шаг перемещения по оси z).
Анимация вращения узла графа сцены создается с помощью класса RotateTransition, имеющим свойства node (целевой узел анимации), duration (продолжительность анимации), axis (ось вращения javafx.geometry. Point3D), fromAngle (начальный угол вращения), toAngle (конечный угол вращения) и byAngle (шаг вращения).
Анимация масштабирования узла графа сцены создается с помощью класса ScaleTransition, имеющим свойства node (целевой узел анимации),